package Thread;

import java.util.concurrent.Exchanger;

/**
 * @author 逸尘风清
 * @date 2021/4/28
 * @time 15:04
 * 描述：两个线程间数据交换
 * 原理：当第一个线程执行到exchanger的时候，将value进行存储，然后进行阻塞等待；   当第二个线程执行到到exchanger的时候，将value进行存储。
 *      两个线程都执行完exchanger之后，交换数据，两个线程各自继续往下执行。
 *      如果有一个线程没有执行到exchanger，那么另外一个线程就会一直阻塞等待
 */

public class TestExchanger {
    static Exchanger<String> exchanger = new Exchanger<>();

    public static void main(String[] args) {
        new Thread(()->{
            String value = "T1";
            try {
                value = exchanger.exchange(value);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " " + value);

        }, "t1").start();


        new Thread(()->{
            String value = "T2";
            try {
                value = exchanger.exchange(value);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " " + value);

        }, "t2").start();
    }
}
